From e2b8efcbecac6864148f1bc1d738ccf7e3c4feb3 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Fri, 25 Jun 2010 19:37:54 +0200 Subject: [PATCH] GtkStyleSet: Add API to map symbolic colors. --- gtk/gtkstyleset.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++ gtk/gtkstyleset.h | 10 ++++--- 2 files changed, 74 insertions(+), 3 deletions(-) diff --git a/gtk/gtkstyleset.c b/gtk/gtkstyleset.c index 5d8a856bc1..be07f6308f 100644 --- a/gtk/gtkstyleset.c +++ b/gtk/gtkstyleset.c @@ -48,6 +48,7 @@ struct PropertyData struct GtkStyleSetPrivate { + GHashTable *color_map; GHashTable *properties; }; @@ -126,6 +127,9 @@ gtk_style_set_finalize (GObject *object) priv = GTK_STYLE_SET_GET_PRIVATE (object); g_hash_table_destroy (priv->properties); + if (priv->color_map) + g_hash_table_destroy (priv->color_map); + G_OBJECT_CLASS (gtk_style_set_parent_class)->finalize (object); } @@ -260,6 +264,47 @@ gtk_style_set_new (void) return g_object_new (GTK_TYPE_STYLE_SET, NULL); } +void +gtk_style_set_map_color (GtkStyleSet *set, + const gchar *name, + GtkSymbolicColor *color) +{ + GtkStyleSetPrivate *priv; + + g_return_if_fail (GTK_IS_STYLE_SET (set)); + g_return_if_fail (name != NULL); + g_return_if_fail (color != NULL); + + priv = GTK_STYLE_SET_GET_PRIVATE (set); + + if (G_UNLIKELY (!priv->color_map)) + priv->color_map = g_hash_table_new_full (g_str_hash, + g_str_equal, + (GDestroyNotify) g_free, + (GDestroyNotify) gtk_symbolic_color_unref); + + g_hash_table_replace (priv->color_map, + g_strdup (name), + gtk_symbolic_color_ref (color)); +} + +GtkSymbolicColor * +gtk_style_set_lookup_color (GtkStyleSet *set, + const gchar *name) +{ + GtkStyleSetPrivate *priv; + + g_return_val_if_fail (GTK_IS_STYLE_SET (set), NULL); + g_return_val_if_fail (name != NULL, NULL); + + priv = GTK_STYLE_SET_GET_PRIVATE (set); + + if (!priv->color_map) + return NULL; + + return g_hash_table_lookup (priv->color_map, name); +} + static void set_property_internal (GtkStyleSet *set, const gchar *property, @@ -570,6 +615,28 @@ gtk_style_set_merge (GtkStyleSet *set, priv = GTK_STYLE_SET_GET_PRIVATE (set); priv_to_merge = GTK_STYLE_SET_GET_PRIVATE (set_to_merge); + /* Merge symbolic color map */ + if (priv_to_merge->color_map) + { + g_hash_table_iter_init (&iter, priv_to_merge->color_map); + + while (g_hash_table_iter_next (&iter, &key, &value)) + { + const gchar *name; + GtkSymbolicColor *color; + + name = key; + color = value; + + if (!replace && + g_hash_table_lookup (priv->color_map, name)) + continue; + + gtk_style_set_map_color (set, name, color); + } + } + + /* Merge symbolic style properties */ g_hash_table_iter_init (&iter, priv_to_merge->properties); while (g_hash_table_iter_next (&iter, &key, &value)) diff --git a/gtk/gtkstyleset.h b/gtk/gtkstyleset.h index d14deb89d1..88a11aee3b 100644 --- a/gtk/gtkstyleset.h +++ b/gtk/gtkstyleset.h @@ -23,9 +23,7 @@ #include #include #include "gtkenums.h" - -/* GtkBorder is defined there */ -#include "gtkstyle.h" +#include "gtksymboliccolor.h" G_BEGIN_DECLS @@ -59,6 +57,12 @@ gboolean gtk_style_set_lookup_property (const gchar *property_name, GtkStyleSet * gtk_style_set_new (void); +void gtk_style_set_map_color (GtkStyleSet *set, + const gchar *name, + GtkSymbolicColor *color); +GtkSymbolicColor * gtk_style_set_lookup_color (GtkStyleSet *set, + const gchar *name); + void gtk_style_set_set_default (GtkStyleSet *set, const gchar *property, const GValue *value); -- 2.30.2